home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / PowerD / Dmod / dmod_Warp3D / examples / w3d_txtr_cgx.d < prev    next >
Encoding:
Text File  |  2002-10-28  |  10.9 KB  |  378 lines

  1. // a bit more complex example with (silly) textures, z-buffer, doublebuffering, smoothing for CGFX+W3D
  2.  
  3. MODULE    'intuition/intuition',
  4.             'intuition/screens',
  5.             'utility/tagitem',
  6.             'graphics/modeid',
  7.             'graphics/view',
  8.             'exec/memory'
  9.  
  10. MODULE    'warp3d',
  11.             'warp3d/warp3d'
  12. MODULE    'cybergraphx/cybergraphics',
  13.             'cybergraphics'
  14.  
  15. PROC Go()
  16.     // build all needed vertexes
  17.     DEF    v[8]:W3D_Vertex,n
  18.     DEF    p=[    // cube vertex and colour definition
  19.         -1,-1,-1,    0,0,0,
  20.         +1,-1,-1,    0,0,1,
  21.         +1,-1,+1,    0,1,0,
  22.         -1,-1,+1,    0,1,1,
  23.         -1,+1,-1,    1,0,0,
  24.         +1,+1,-1,    1,0,1,
  25.         +1,+1,+1,    1,1,1,
  26.         -1,+1,+1,    1,1,0]:vertex
  27.     DEF    sqr=[    // squares definition of points ids
  28.         0,3,7,4,        // left
  29.         1,2,6,5,        // right
  30.         0,1,5,4,        // back
  31.         2,3,7,6,        // front
  32.         0,1,2,3,        // bottom
  33.         4,5,6,7]:W    // top
  34.  
  35.     // setup all the vertex colours
  36.     FOR n:=0 TO 7
  37.         v[n].w:=0.0
  38.         v[n].u:=0.0
  39.         v[n].v:=0.0
  40.         v[n].tex3d:=0
  41.         v[n].color.a:=1.0
  42.         v[n].color.r:=p[n].r
  43.         v[n].color.g:=p[n].g
  44.         v[n].color.b:=p[n].b
  45.         v[n].spec.r:=1.0
  46.         v[n].spec.g:=1.0
  47.         v[n].spec.b:=1.0
  48.         v[n].l:=0
  49.     ENDFOR
  50.  
  51.     // preparation of all textures
  52.     DEF    txtr[6]:PTR TO W3D_Texture,err
  53.     FOR n:=0 TO 5 txtr[n]:=NIL
  54.     IFN txtr[0]:=W3D_AllocTexObjTags(context,&err,
  55.         W3D_ATO_IMAGE,[
  56.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  57.             $ffff,$ffff,$ffff,$f005,$f005,$ffff,$ffff,$ffff,
  58.             $ffff,$ffff,$f004,$f004,$f004,$ffff,$ffff,$ffff,
  59.             $ffff,$ffff,$ffff,$f003,$f003,$ffff,$ffff,$ffff,
  60.             $ffff,$ffff,$ffff,$f002,$f002,$ffff,$ffff,$ffff,
  61.             $ffff,$ffff,$ffff,$f001,$f001,$ffff,$ffff,$ffff,
  62.             $ffff,$ffff,$f000,$f000,$f000,$f000,$ffff,$ffff,
  63.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  64.             ]:UW,
  65.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  66.         W3D_ATO_WIDTH,8,
  67.         W3D_ATO_HEIGHT,8,
  68.         TAG_END) THEN Raise("TXR",err)
  69.     IFN txtr[1]:=W3D_AllocTexObjTags(context,&err,
  70.         W3D_ATO_IMAGE,[
  71.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  72.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  73.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  74.             $ffff,$ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,
  75.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  76.             $ffff,$ffff,$f000,$ffff,$ffff,$ffff,$ffff,$ffff,
  77.             $ffff,$ffff,$f000,$f000,$f000,$f000,$ffff,$ffff,
  78.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  79.             ]:UW,
  80.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  81.         W3D_ATO_WIDTH,8,
  82.         W3D_ATO_HEIGHT,8,
  83.         TAG_END) THEN Raise("TXR",err)
  84.     IFN txtr[2]:=W3D_AllocTexObjTags(context,&err,
  85.         W3D_ATO_IMAGE,[
  86.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  87.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  88.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  89.             $ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,$ffff,
  90.             $ffff,$ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,
  91.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  92.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  93.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  94.             ]:UW,
  95.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  96.         W3D_ATO_WIDTH,8,
  97.         W3D_ATO_HEIGHT,8,
  98.         TAG_END) THEN Raise("TXR",err)
  99.     IFN txtr[3]:=W3D_AllocTexObjTags(context,&err,
  100.         W3D_ATO_IMAGE,[
  101.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  102.             $ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,$ffff,
  103.             $ffff,$ffff,$ffff,$000f,$ffff,$ffff,$ffff,$ffff,
  104.             $ffff,$ffff,$f000,$ffff,$ffff,$ffff,$ffff,$ffff,
  105.             $ffff,$ffff,$f000,$ffff,$f000,$ffff,$ffff,$ffff,
  106.             $ffff,$ffff,$f000,$f000,$f000,$f000,$ffff,$ffff,
  107.             $ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,$ffff,
  108.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  109.             ]:UW,
  110.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  111.         W3D_ATO_WIDTH,8,
  112.         W3D_ATO_HEIGHT,8,
  113.         TAG_END) THEN Raise("TXR",err)
  114.     IFN txtr[4]:=W3D_AllocTexObjTags(context,&err,
  115.         W3D_ATO_IMAGE,[
  116.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  117.             $ffff,$ffff,$f000,$f000,$f000,$f000,$ffff,$ffff,
  118.             $ffff,$ffff,$f000,$ffff,$ffff,$ffff,$ffff,$ffff,
  119.             $ffff,$ffff,$f000,$f000,$f000,$ffff,$ffff,$ffff,
  120.             $ffff,$ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,
  121.             $ffff,$ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,
  122.             $ffff,$ffff,$f000,$f000,$f000,$ffff,$ffff,$ffff,
  123.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  124.             ]:UW,
  125.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  126.         W3D_ATO_WIDTH,8,
  127.         W3D_ATO_HEIGHT,8,
  128.         TAG_END) THEN Raise("TXR",err)
  129.     IFN txtr[5]:=W3D_AllocTexObjTags(context,&err,
  130.         W3D_ATO_IMAGE,[
  131.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  132.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  133.             $ffff,$ffff,$f000,$ffff,$ffff,$ffff,$ffff,$ffff,
  134.             $ffff,$ffff,$f000,$f000,$f000,$ffff,$ffff,$ffff,
  135.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  136.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  137.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  138.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  139.             ]:UW,
  140.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  141.         W3D_ATO_WIDTH,8,
  142.         W3D_ATO_HEIGHT,8,
  143.         TAG_END) THEN Raise("TXR",err)
  144.  
  145.     // set bilinear filtering for all textures
  146. //    FOR n:=0 TO 5 W3D_SetFilter(context,txtr[n],W3D_LINEAR,W3D_LINEAR)
  147.  
  148.     // setup the trifan for the above vertexes
  149.     DEF    trifan:W3D_TrianglesV
  150.     trifan.vertexcount:=4
  151.     trifan.v:=[NIL,NIL,NIL,NIL,NIL]:UL    // prepare the field
  152.     trifan.tex:=NIL
  153.     trifan.st_pattern:=NIL
  154.  
  155.     DEF    msg:PTR TO IntuiMessage,class,next=TRUE
  156.     DEF    angles=[0,0,0,0,0,0]:vertex,ver:PTR TO PTR TO W3D_Vertex
  157.     WHILE next
  158.         IF msg:=GetMsg(window.UserPort)
  159.             SELECT class:=msg.Class
  160.             CASE IDCMP_MOUSEMOVE
  161.                 angles.x:=msg.MouseY/50
  162.                 angles.y:=msg.MouseX/50
  163.             DEFAULT
  164.                 next:=FALSE
  165.             ENDSELECT
  166.             ReplyMsg(msg)
  167.         ENDIF
  168.  
  169.         FOR n:=0 TO 7 Compute3DPoint(v[n],p[n],angles)
  170.  
  171.         // lock hardware to allow to use it
  172.         IF W3D_SUCCESS=W3D_LockHardware(context)
  173.             // crear the screen and the z-buffer
  174.             W3D_ClearDrawRegion(context,0)
  175.             W3D_ClearZBuffer(context,[1]:D)
  176.             // draw all the flats
  177.             FOR n:=0 TO 5
  178.                 ver:=trifan.v
  179.                 ver[0]:=v[sqr[n*4+0]]
  180.                 ver[0].u:=0
  181.                 ver[0].v:=0
  182.                 ver[1]:=v[sqr[n*4+1]]
  183.                 ver[1].u:=7
  184.                 ver[1].v:=0
  185.                 ver[2]:=v[sqr[n*4+2]]
  186.                 ver[2].u:=7
  187.                 ver[2].v:=7
  188.                 ver[3]:=v[sqr[n*4+3]]
  189.                 ver[3].u:=0
  190.                 ver[3].v:=7
  191.                 trifan.tex:=txtr[n]
  192.                 W3D_DrawTriFanV(context,trifan)
  193.             ENDFOR
  194.             W3D_UnLockHardware(context)
  195.         ELSE Raise("LHW")
  196.  
  197.         // swap the buffers
  198.         SwitchBuffers()
  199.     ENDWHILE
  200. EXCEPTDO
  201.     FOR n:=0 TO 5 IF txtr[n] THEN W3D_FreeTexObj(context,txtr[n])
  202.     Raise(exception,exceptioninfo)
  203. ENDPROC
  204.  
  205. PROC Compute3DPoint(pixel:PTR TO W3D_Vertex,vertex:PTR TO vertex,angles:PTR TO vertex)
  206.     DEFD    x,y,z,xx,yy,zz,x1,y1,z1,lminuszz
  207.     x:=vertex.x
  208.     y:=vertex.y
  209.     z:=vertex.z
  210.  
  211.     x1:=x*Cos(angles.z)+y*Sin(angles.z)
  212.     y1:=y*Cos(angles.z)-x*Sin(angles.z)
  213.     xx:=x1*Cos(angles.y)+z*Sin(angles.y)
  214.     z1:=z*Cos(angles.y)-x1*Sin(angles.y)
  215.     zz:=z1*Cos(angles.x)+y1*Sin(angles.x)
  216.     yy:=y1*Cos(angles.x)-z1*Sin(angles.x)
  217.  
  218.     lminuszz:=5-zz
  219.     IF lminuszz>0.0
  220.         x:=xx*5/lminuszz
  221.         y:=-yy*5/lminuszz
  222.     ELSE RETURN
  223.     x*=height/4
  224.     y*=height/4
  225.     x+=width/2
  226.     y+=height/2
  227.     pixel.x:=x
  228.     pixel.y:=y
  229.     pixel.z:=(-zz+5)/10
  230.     pixel.w:=0.1/pixel.z
  231. ENDPROC
  232.  
  233. PROC SwitchBuffers()
  234.     IFN bufnum
  235.         bm:=buf2.BitMap
  236.         W3D_SetDrawRegion(context,bm,0,scissor)
  237.         buf1.DBufInfo.SafeMessage.ReplyPort:=NIL
  238.         WHILEN ChangeScreenBuffer(screen,buf1);    ENDWHILE
  239.         WaitTOF()
  240.         bufnum:=1
  241.     ELSE
  242.         bm:=buf1.BitMap
  243.         W3D_SetDrawRegion(context,bm,0,scissor)
  244.         buf2.DBufInfo.SafeMessage.ReplyPort:=NIL
  245.         WHILEN ChangeScreenBuffer(screen,buf2);    ENDWHILE
  246.         WaitTOF()
  247.         bufnum:=0
  248.     ENDIF
  249. ENDPROC
  250.  
  251. OBJECT vertex
  252.     x/y/z:F,
  253.     r/g/b:F
  254.  
  255. DEF    Warp3DBase,CyberGfxBase
  256.  
  257. DEF    screen:PTR TO Screen,window:PTR TO Window,context:PTR TO W3D_Context,scissor:PTR TO W3D_Scissor,
  258.         width,height,buf1:PTR TO ScreenBuffer,buf2:PTR TO ScreenBuffer,bm:PTR TO BitMap,bufnum
  259.  
  260. PROC main()
  261.     OpenAll()
  262.     Go()
  263. EXCEPTDO
  264.     CloseAll()
  265.     DEF    err,err2=NIL
  266.     SELECT exception
  267.     CASE "CGX";    err:='unable to open cybergraphics.library'
  268.     CASE "W3D";    err:='unable to open warp3d.library'
  269.     CASE "DRV";    err:='unsuitable 3d driver'
  270.     CASE "N15";    err:='15 bit buffer unsupported'
  271.     CASE "MID";    err:='invalid screen mode'
  272.     CASE "SCR";    err:='unable to open screen'
  273.     CASE "SCB";    err:='unable to get screen buffer'
  274.     CASE "CGB";    err:='no cybergraphics bitmap: screen buffer '
  275.         err2:=["0"+exceptioninfo,0]:CHAR
  276.     CASE "WIN";    err:='unable to open window'
  277.     CASE "CTX";    err:='unable to build context: '
  278.         SELECT exceptioninfo
  279.         CASE W3D_ILLEGALINPUT;    err2:='illegal input'
  280.         CASE W3D_NOMEMORY;        err2:='no memory'
  281.         CASE W3D_NODRIVER;        err2:='no driver'
  282.         CASE W3D_UNSUPPORTEDFMT;err2:='unsupported format'
  283.         CASE W3D_ILLEGALBITMAP;    err2:='illegal bitmap'
  284.         ENDSELECT
  285.     CASE "LHW";    err:='can''t lock hardware'
  286.     CASE "MEM";    err:='not enough memory'
  287.     CASE "ZBU";    err:='unable to build z-buffer: '
  288.         SELECT exceptioninfo
  289.         CASE W3D_NOGFXMEM;    err2:='no video memory'
  290.         CASE W3D_NOZBUFFER;    err2:='z-bufering not supported'
  291.         ENDSELECT
  292.     DEFAULT;        err:='   ';    StrCopy(err,[exception<<8]:L,3)
  293.     ENDSELECT
  294.     IF exception THEN PrintF('\s\s\n',err,err2)
  295. ENDPROC
  296.  
  297. PROC OpenAll()
  298.     IFN CyberGfxBase:=OpenLibrary('cybergraphics.library',0) THEN Raise("CGX")
  299.     IFN Warp3DBase:=OpenLibrary('Warp3D.library',0) THEN Raise("W3D")
  300.  
  301.     DEF    flags=W3D_CheckDriver()
  302.     IFN flags&W3D_DRIVER_3DHW||flags&W3D_DRIVER_CPU THEN Raise("DRV")
  303.  
  304.     DEF    format=W3D_GetDestFmt()
  305.     IFN format&W3D_FMT_R5G5B5 THEN Raise("N15")
  306.  
  307.     DEF    modeid
  308.     IF (modeid:=CModeRequestTags(NIL,
  309.         CYBRMREQ_MinDepth,15,
  310.         CYBRMREQ_MaxDepth,15,
  311.         TAG_END))=INVALID_ID THEN Raise("MID")
  312.  
  313.     IF IsCyberModeID(modeid)
  314.         width:=GetCyberIDAttr(CYBRIDATTR_Width,modeid)
  315.         height:=GetCyberIDAttr(CYBRIDATTR_Height,modeid)
  316.     ELSE Raise("MID")
  317.  
  318.     IFN screen:=OpenScreenTags(NIL,
  319.         SA_Width,width,
  320.         SA_Height,height,
  321.         SA_DisplayID,modeid,
  322.         SA_ShowTitle,FALSE,
  323.         SA_Draggable,FALSE,
  324.         TAG_END) THEN Raise("SCR")
  325.  
  326.     // prepare double buffering
  327.     IFN buf1:=AllocScreenBuffer(screen,NIL,SB_SCREEN_BITMAP) THEN Raise("SCB")
  328.     IFN GetCyberMapAttr(buf1.BitMap,CYBRMATTR_IsCyberGfx) THEN Raise("CGB",1)
  329.     IFN buf2:=AllocScreenBuffer(screen,NIL,0) THEN Raise("SCB")
  330.     IFN GetCyberMapAttr(buf2.BitMap,CYBRMATTR_IsCyberGfx) THEN Raise("CGB",2)
  331.     buf1.DBufInfo.SafeMessage.ReplyPort:=NIL
  332.     WHILEN ChangeScreenBuffer(screen,buf1);    ENDWHILE
  333.     WaitTOF()
  334.     bm:=buf1.BitMap
  335.     bufnum:=0
  336.  
  337.     IFN window:=OpenWindowTags(NIL,
  338.         WA_CustomScreen,screen,
  339.         WA_Width,screen.Width,
  340.         WA_Height,screen.Height,
  341.         WA_Left,0,
  342.         WA_Top,0,
  343.         WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY|IDCMP_MOUSEMOVE,
  344.         WA_Flags,WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_REPORTMOUSE,
  345.         TAG_END) THEN Raise("WIN")
  346.  
  347.     DEF    cerr
  348.     IFN context:=W3D_CreateContextTags(&cerr,
  349.         W3D_CC_MODEID,modeid,
  350.         W3D_CC_DRIVERTYPE,W3D_DRIVER_BEST,
  351.         W3D_CC_BITMAP,bm,
  352.         W3D_CC_YOFFSET,0,
  353.         TAG_END) THEN Raise("CTX",cerr)
  354.     IFN W3D_SUCCESS=(cerr:=W3D_AllocZBuffer(context)) THEN Raise("ZBU",cerr)
  355.  
  356.     // setup the rendering usage
  357.     W3D_SetState(context,W3D_TEXMAPPING,W3D_ENABLE)
  358.     W3D_SetState(context,W3D_GOURAUD,W3D_ENABLE)
  359.     W3D_SetState(context,W3D_ZBUFFER,W3D_ENABLE)
  360.     W3D_SetState(context,W3D_PERSPECTIVE,W3D_ENABLE)
  361.     W3D_SetZCompareMode(context,W3D_Z_LESS)
  362.     W3D_Hint(context,W3D_H_BILINEARFILTER,W3D_H_NICE)
  363.  
  364.     scissor:=[0,0,width,height]:W3D_Scissor
  365.     SwitchBuffers()
  366. ENDPROC
  367.  
  368. PROC CloseAll()
  369.     W3D_FreeZBuffer(context)
  370.     IF context THEN W3D_DestroyContext(context)
  371.     IF window THEN CloseWindow(window)
  372.     IF buf2 THEN FreeScreenBuffer(screen,buf2)
  373.     IF buf1 THEN FreeScreenBuffer(screen,buf1)
  374.     IF screen THEN CloseScreen(screen)
  375.     IF Warp3DBase THEN CloseLibrary(Warp3DBase)
  376.     IF CyberGfxBase THEN CloseLibrary(CyberGfxBase)
  377. ENDPROC
  378.